package com.yuan.key_code;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.net.URI;

/**
 * 实现 HDFS 文件复制功能，支持用户选择文件,将hadoop文件copy到本地
 */
public class CopyFile {

    public static void main(String[] args) throws IOException {
        // 创建配置对象
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");
        conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

        // 获取输入和输出路径
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入源目录路径（HDFS）：如hdfs://localhost:9000/user/hadoop/input");
        String inputPathStr = reader.readLine();
        Path inputPath = new Path(inputPathStr);

        System.out.println("请输入目标目录路径（HDFS）：/home/qinli/hadoop/output");
        String outputPathStr = reader.readLine();
        Path outputPath = new Path(outputPathStr);

        //!获取文件系统对象
        FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
        FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);

        // 列出源目录中的所有文件
        FileStatus[] fileStatuses = fsSource.listStatus(inputPath);//!获取源目录中的所有文件
        if (fileStatuses.length == 0) {
            System.out.println("源目录为空！");
            return;
        }

        System.out.println("源目录包含以下文件：");
        for (int i = 0; i < fileStatuses.length; i++) {
            System.out.println((i + 1) + ". " + fileStatuses[i].getPath().getName());
        }

        // 用户选择要复制的文件
        System.out.print("请输入要复制的文件编号（多个文件用逗号分隔，例如：1,2,3）：");
        String[] selectedIndices = reader.readLine().split(",");
        for (String indexStr : selectedIndices) {
            int index = Integer.parseInt(indexStr.trim()) - 1;
            if (index >= 0 && index < fileStatuses.length) {
                Path srcPath = fileStatuses[index].getPath();
                Path dstPath = new Path(outputPath, srcPath.getName());

                // 执行文件复制操作
                System.out.println("正在复制文件：" + srcPath + " 到 " + dstPath);
                fsSource.copyToLocalFile(false, srcPath, dstPath, true);//!执行文件复制操作
            } else {
                System.out.println("无效的文件编号：" + (index + 1));
            }
        }

        // 关闭文件系统对象
        fsSource.close();
        fsDst.close();

        System.out.println("文件复制完成！");
    }
}